IDA pro 静态分析

一、几个概念

1. 反汇编与反编译

源代码程序–>可执行程序,需要经过编译器–>汇编器–>链接器;用来撤销编译和汇编的过程,称之为反编译和反汇编

  • 反汇编:从机器码到汇编代码
  • 反编译:以汇编代码或机器码到高级语言
2. 常见的指令架构

指令架构:x86、ARM、MIPS

  • x86主要应用于pc机上,主要有两种语法表示汇编代码:Intel和AT&T
  • ARM主要应用于移动端,它的分类也很多,这里不展开
  • MIPS主要应用于路由器等设备上
3. 反汇编的主要方法

反汇编的主要方法:线性扫描、递归下降

4. ida

ida是一种递归下降的反汇编器,它支持静态分析和动态调试程序,尤其是在静态分析领域,ida是一款神器
下面介绍了ida静态分析程序的相关约定
ida的命名方式与虚拟地址和栈帧变量有关,常见的有以下几个

sub_xxxx  地址xxxx处的子例程(过程/方法)
loc_xxxx  地址xxxx处的一个指令
byte_xxxx  位置xxxx处的8位数据
unk_xxxx  位置xxxx处的大小未知的数据

栈是程序运行是的一种数据传输方式,ida在静态分析中提供了栈视图来方便用户的使用

.text:00401020 ; Attributes: bp-based frame
.text:00401020
.text:00401020 ; int __cdecl sub_401020(char *)
.text:00401020 sub_401020  proc near   ; CODE XREF: sub_401005↑j
.text:00401020
.text:00401020 var_4C  = byte ptr -4Ch        //IDA提供的一个摘要栈视图,列出栈帧内被直接引用的每一个变量,以及大小与帧指针的偏移量
.text:00401020 var_C   = byte ptr -0Ch         // var_为局部变量名称的前缀,后面表示变量与被保存的帧指针之间距离
.text:00401020 var_4   = dword ptr -4
.text:00401020 arg_0   = dword ptr  8         // 函数参数名以arg_为前缀,后面表示与最顶端参数之间的相对距离(十六进制)
.text:00401020
.text:00401020 push ebp ;  
.text:00401021 mov ebp, esp
.text:00401023 sub esp, 4Ch
.text:00401026 push ebx

下图为ida通过两种寄存器ESP和EBP来表示栈

二、ida中具体的操作

1、静态分析中常用快捷键
  • F5/tab:功能都是查看伪c代码,但tab可以在伪c代码和汇编之间相互切换,且切换时光标位置相同
  • shift+F12 : strings
  • shift+F7 :segments
  • alt+t :text search
  • ctrl+t: next text
  • g :快速查找到对应地址
  • shift+e :提取数据
  • Enter:跟进函数实现,查看标号对应的地址
  • Esc 返回跟进处
  • A 解释光标处的地址为一个字符串的首地址
  • B 十六进制数与二进制数转换
  • C 解释光标处的地址为一条指令
  • D 解释光标处的地址为数据
  • H 十六进制数与十进制数转换
  • K 将数据解释为栈变量
  • X 转换视图到交叉参考模式
2、ida 对于结构体的定义及标识
  • 可之间引用的结构体:
    • IDA会根据文件的类型自动加载相应的类型库,如vc6win(VisualC++6.0),用户做底层分析时,可以添加mssdk(windows.h)、ntddk(ntddk.h)等。这些库中有相应的结构体,用户分析代码时,可以直接引用。可以通过快捷键”Shitft+F11“,打开加载类型库窗口,然后用鼠标右键选择”Load Type Library(或快捷键Insert)“,在弹出的窗口中选择相应类型库。选择好类型库后就可以查看内置数据结构了。选择菜单”View/Open subviews/Structure就可以打开结构体管理窗口。按Insert键,在弹出的窗口中选择”Add Standard Structure“,打开标准结构库窗口查找需要的结构名,然后就可以正常使用这些库了。• 在默认情况下,IDA会加载常用的结构,程序类常用的结构体会显示出来,在WNDCLASSA结构一行单击右键,在弹出的菜单中选择Unhide,快捷键是Ctrl++可展开结构,程序相应代码处直接以结构体显示。收起结构的快捷键是Ctrl+-。
  • 定义新的结构体
    • 打开结构体窗口,按下Insert键增加一个新的结构体类型,命名为student。把光标停留在student结构的ends一行,按D键可以键入数据(如id、age)等,重复D键可以在db、dw、dd间切换,直到变成dd,表示是dword类型。而按A键则是键入ASCII字符(如name)为结构体成员。通过N键可以修改相应名称。
  • 把数据标识成结构体
    • 创建好结构体后,可以将鼠标放在要被定义的这个位置处,然后执行菜单”Edit/Structs/Sturcuvar“命令,或者快捷键alt+Q,然后选择student结构体。这时对应的数据会被标识为相应的结构体。然后在对应的代码位置0x00401006处,选择需要重新定义的数据,如[esi+18h]通过”Edit/Operand types/Offset/Offset(Struct)“或者快捷键T可将相应位置的代码修改为有意义的结构体名称。

三、在linux中安装ida

wine安装(官网)–>安装ida(不安装python27 x64)–>下载 Python 2.7 的 MSI 文件,命令行下执行:wine64 msiexec /i python-2.7.15.amd64.msi
wine安装的文件在/home/.wine/drive_c/中,这个相当与windows的c盘